package controllers.pojo;

public class Partida {
	
	public String[][] matriz;
	public int alturaMatriz;
	public int larguraMatriz;
	public int qtdCaixasFechadas;
	public int qtdCaixasTotal;

	public Partida() {
	}

	public Partida(int altura, int largura) {
		qtdCaixasTotal = 0;
		qtdCaixasFechadas = 0;
		alturaMatriz = (altura * 2) - 1;
		larguraMatriz = (largura * 2) - 1;
		matriz = new String[alturaMatriz][larguraMatriz];

		for (altura = 0; altura < alturaMatriz; altura++) {
			for (largura = 0; largura < larguraMatriz; largura++) {
				// posicao dos pontos
				if (altura % 2 == 0 && largura % 2 == 0) {
					matriz[altura][largura] = "*";
					// posicao interna entre os tracos de uma caixa
				} else if ((altura % 2 == 1) && (largura % 2 == 1)) {
					matriz[altura][largura] = "[0]";
					qtdCaixasTotal++;
					// posicao dos tracos
				} else {
					matriz[altura][largura] = "0";
				}
			}
		}
	}

	public boolean jogadaValida(int altura, int largura) {
		// a posicao nao pode estar fora dos limites da matriz
		// nao pode ser uma posicao interna das caixas
		// nao pode ser uma posicao de ponto
		// nao pode ja ter sido marcado
		if ((altura < 0 || altura > alturaMatriz)
				|| (largura < 0 || largura > larguraMatriz)
				|| (altura % 2 == 1 && largura % 2 == 1)
				|| matriz[altura][largura] == "*"
				|| matriz[altura][largura] == "1") {

			return false;
		}
		return true;
	}

	public int efetuarJogada(int altura, int largura, String jogador) {

		matriz[altura][largura] = "1";
		adicionarValorJogada(altura, largura, jogador);
		int qtdCaixaFechadasAtual = contabilizarCaixasFechadas();

		int pontosGanhos = qtdCaixaFechadasAtual - qtdCaixasFechadas;
		qtdCaixasFechadas = qtdCaixaFechadasAtual;

		return pontosGanhos;
	}

	private void adicionarValorJogada(int altura, int largura, String jogador) {

		// logica basica testando os extremos da matriz
		// e as posicoes de altura e largura

		if (altura % 2 == 0) {
			if (altura == 0) {
				incrementarCaixa(altura + 1, largura, jogador);
			} else if (altura == alturaMatriz - 1) {
				incrementarCaixa(altura - 1, largura, jogador);
			} else {
				incrementarCaixa(altura + 1, largura, jogador);
				incrementarCaixa(altura - 1, largura, jogador);
			}
		} else {
			if (largura == 0) {
				incrementarCaixa(altura, largura + 1, jogador);
			} else if (largura == larguraMatriz - 1) {
				incrementarCaixa(altura, largura - 1, jogador);
			} else {
				incrementarCaixa(altura, largura - 1, jogador);
				incrementarCaixa(altura, largura + 1, jogador);
			}
		}
	}

	private void incrementarCaixa(int altura, int largura, String jogador) {
		// obtem o valor atual da caixa
		String s = matriz[altura][largura];

		// extrai o inteiro dentro dos colchetes
		String s2 = String.valueOf(s.charAt(1));
		int a = Integer.parseInt(s2);

		// salva o valor incrementado em colchetes
		a += 1;
		matriz[altura][largura] = "[" + a + "]";
		if (a == 4) {
			matriz[altura][largura] = "[" + jogador + "]";
		}
	}

	private int contabilizarCaixasFechadas() {
		int qtdCaixas = 0;

		for (int altura = 1; altura < alturaMatriz; altura += 2) {
			for (int largura = 1; largura < larguraMatriz; largura += 2) {
				if (!matriz[altura][largura].equals("[0]")
						&& !matriz[altura][largura].equals("[1]")
						&& !matriz[altura][largura].equals("[2]")
						&& !matriz[altura][largura].equals("[3]")) {
					qtdCaixas += 1;
				}
			}
		}

		return qtdCaixas;
	}

	@Override
	public String toString() {
		String s = "";
		for (int i = 0; i < alturaMatriz; i++) {
			for (int j = 0; j < larguraMatriz; j++) {
				s += matriz[i][j] + "\t";
			}
			s += "\n";
		}
		return s;
	}
}
